/*
n
p[n] 
d[n] 全部不同

每次删除完，修复当前数列为1~n
只可以把d[i]修改为i

每轮数字分为 不需要处理 因被改为0的位置需要被动处理 因本身改为0需要处理
*/
#include <cstdio> 
#include <cstring>
using namespace std;
template <typename T>
inline void read(T& x)
{
    int c=getchar(), f=1; x=0;
    while(c<'0'||'9'<c) {if(c=='-') f=-1; c=getchar();}
    while('0'<=c&&c<='9') 
        x=(x<<3)+(x<<1)+c-'0', c=getchar();
    x*=f;
}

inline void write(long long x)
{
    if(x>=10) write(x/10);
    putchar(x%10+'0');
}
#define DEBUG
using ll=long long;
const int N=2e5+10;
int n;
int p[N], d[N]; //待排序数组 删除顺序
bool change[N];
ll ans;

void init()
{
    ans=0;
    memset(change, 0, sizeof change);
    read(n); 
    for(int i=1; i<=n; i++) read(p[i]);
    for(int i=1; i<=n; i++) read(d[i]);

}

void solve()
{
    init();
    for(int i=1; i<=n; i++)
    {
        int pos=d[i];
        int ori=p[pos]; //pos上本身数值 2
        int temp=ori;
        ans+=!change[pos]; //本身数值如果不一样，需要替换另一个位置的值,也可能被之前修改了
        if(p[pos]!=pos) change[pos]=true, p[pos]=pos;
        while(p[ori]!=ori) ans++, change[ori]=true, temp=p[ori], p[ori]=ori, ori=temp; //递归搜索
        
        write(ans); putchar(' ');
    }
    puts("");
}

// #undef DEBUG
signed main()
{
    #ifdef DEBUG
        freopen("../in.txt", "r", stdin);
        freopen("../out.txt", "w", stdout);
    #endif

    int T=1; scanf("%d", &T);
    while(T--) 
    {
        solve();
    }
    return 0;
}